﻿#include "SrDecode.h"
#include "base/TraceLog.h"

SrDecode::SrDecode()
{
	
}

bool SrDecode::Open(AVCodecParameters * codecpar)
{
	if (!codecpar) return false;
	///////////////////////////////////////////////////////
	/// 视频解码器打开
	/// 找到解码器
	AVCodec *vcodec = avcodec_find_decoder(codecpar->codec_id);
	if (!vcodec)
	{
		avcodec_parameters_free(&codecpar);
		LogINFO("can't find the codec id %d ", codecpar->codec_id);

		return false;
	}


	/// 创建解码器上下文
	_codec = avcodec_alloc_context3(vcodec);

	/// 配置解码器上下文参数
	avcodec_parameters_to_context(_codec, codecpar);
	avcodec_parameters_free(&codecpar);

	// 八线程解码
	_codec->thread_count = 8;

	/// 打开解码器上下文
	int re = avcodec_open2(_codec, 0, 0);
	if (re != 0)
	{
		avcodec_free_context(&_codec);

		char buf[1024] = { 0 };
		av_strerror(re, buf, sizeof(buf) - 1);
		return false;
	}
	return true;

}

bool SrDecode::Send(AVPacket *pkt)
{
	if (!pkt || pkt->size <= 0 || !pkt->data) return false;

	if (!_codec)
	{
		return false;
	}
	int re = avcodec_send_packet(_codec, pkt);
	av_packet_free(&pkt);
	if (re != 0)
	{
		return false;
	}
		
	return true;
}

AVFrame* SrDecode::Recv()
{
	if (!_codec)
	{
		return NULL;
	}
	AVFrame *frame = av_frame_alloc();
	int re = avcodec_receive_frame(_codec, frame);

	if (re != 0)
	{
		av_frame_free(&frame);
		return NULL;
	}
	//cout << "["<<frame->linesize[0] << "] " << flush;
	return frame;
}
SrDecode::~SrDecode()
{
	if (_codec)
	{
		avcodec_close(_codec);
		avcodec_free_context(&_codec);
		_codec = NULL;
	}
}
